package org.example.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;


/**
 *
 * SpringMVC的工作流程是
 * web容器 -> ServletContext -> WebApplicationContext -> Controller
 *
 */

/**
 *
 * 1.服务器启动，执行ServletContainersInitConfig类，初始化web容器
 * 功能类似于以前的web.xml
 *
 * 2.执行createServletApplicationContext方法，创建了WebApplicationContext对象
 *  该方法加载SpringMVC的配置类SpringMvcConfig来初始化SpringMVC的容器
 *
 * 3.加载SpringMvcConfig配置类
 *
 * 4.执行@ComponentScan加载对应的bean
 * 扫描指定包及其子包下所有类上的注解，如Controller类上的@Controller注解
 *
 * 5.加载UserController，每个@RequestMapping的名称对应一个具体的方法
 *
 * 6.执行getServletMappings方法，设定SpringMVC拦截请求的路径规则
 *
 * 7.发送请求http://localhost/save
 *
 * 8.web容器发现该请求满足SpringMVC拦截规则，将请求交给SpringMVC处理
 *
 * 9.解析请求路径/save
 *
 * 10.由/save匹配执行对应的方法save(）
 * 上面的第五步已经将请求路径和方法建立了对应关系，通过/save就能找到对应的save方法
 *
 * 11.执行save()
 *
 * 12.检测到有@ResponseBody直接将save()方法的返回值作为响应体返回给请求方
 *
 * */
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}


//web容器配置类
//public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//
//    //加载springmvc配置类，产生springmvc容器（本质还是spring容器）
//    @Override
//    protected WebApplicationContext createServletApplicationContext() {
//        //初始化WebApplicationContext对象
//        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//        //加载指定配置类
//        ctx.register(SpringMvcConfig.class);
//        return ctx;
//    }
//
//
//    //加载spring配置类
//    protected WebApplicationContext createRootApplicationContext() {
//        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//        ctx.register(SpringConfig.class);
//        return null;
//    }
//
//    //设置由springmvc控制器处理的请求映射路径
//    @Override
//    protected String[] getServletMappings() {
//        return new String[]{"/"};
//    }
//
//}
